//////////////////////////////////////////////////////////////////////
//
// NO_Function.cpp
//
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
#define  NO_TAL_EXPORT

//////////////////////////////////////////////////////////////////////////
#include "NO_Externs.h"
#include "NO_Function.h"
#include "NO_TypeList.h"

//////////////////////////////////////////////////////////////////////////
//
// NO_IFunction
//
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
// con/destruction
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
NO_IFunction::NO_IFunction(const std::string& name):name(name),next(0){}
NO_IFunction::NO_IFunction(const NO_Int8* name):name(name),next(0){}
NO_IFunction::~NO_IFunction(){}

//////////////////////////////////////////////////////////////////////////
// retrieve
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
NO_UInt32			NO_IFunction::getID	(void)	const {return id;}
const std::string &	NO_IFunction::getName(void)	const {return name;}

//////////////////////////////////////////////////////////////////////////
//
// NO_IFuncObject
//
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
// con/destruction
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
NO_IFuncObject::NO_IFuncObject(NO_IFunction const * func):func(func){}
NO_IFuncObject::~NO_IFuncObject(){}

//////////////////////////////////////////////////////////////////////////
// retrieve
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
NO_UInt32			NO_IFuncObject::getID	(void)	const {return func->getID();}
std::string const &	NO_IFuncObject::getName(void)	const {return func->getName();}

//////////////////////////////////////////////////////////////////////////
//
// NO_IFuncBind
//
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
// con/destruction
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
NO_IFuncBind::NO_IFuncBind(NO_IFunction const * func):func(func){}
NO_IFuncBind::~NO_IFuncBind(){}

//////////////////////////////////////////////////////////////////////////
// retrieve
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
NO_UInt32			NO_IFuncBind::getID	(void)	const {return func->getID();}
std::string const &	NO_IFuncBind::getName(void)	const {return func->getName();}

//////////////////////////////////////////////////////////////////////////
// class NO_FunctionFriend definition
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
void			NO_FunctionFriend::setID	(NO_IFunction* f, NO_UInt32 id)		const {f->id = id;}
NO_IFunction*	NO_FunctionFriend::getNext	(const NO_IFunction* f)				const {return f->next;}
void			NO_FunctionFriend::setNext	(NO_IFunction* f, NO_IFunction* n)	const {f->next = n;}

//////////////////////////////////////////////////////////////////////////
//
// NO_FunctionList
//
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
// con/destruction
//////////////////////////////////////////////////////////////////////////
NO_FunctionList::NO_FunctionList(void):first(0),last(0){}
NO_FunctionList::~NO_FunctionList()
{
	const NO_IFunction * iter = first;
	const NO_IFunction * kill = 0;
	while(iter)
	{
		kill = iter;
		iter = getNext(iter);
		delete kill;
	}
}

//////////////////////////////////////////////////////////////////////////
// modify
//////////////////////////////////////////////////////////////////////////
NO_Boolean NO_FunctionList::addFunction(NO_IFunction* obj)
{
	NO_TypeList parameter;
	obj->getParameter(parameter);
	
	NO_UInt32 hash = noGetHash(obj->getName().c_str())+parameter.getID();
	setID(obj, hash);
	if(!first){first = obj;}
	if(last){setNext(last,obj);}
	last = obj;
	return 1;
}

//////////////////////////////////////////////////////////////////////////
// retrieve
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
const NO_IFunction* NO_FunctionList::findFunctionImpl(const NO_Int8* name, const NO_TypeList& list) const
{
	NO_UInt32 hash = noGetHash(name)+list.getID();
	return findFunctionImpl(hash);
}

//////////////////////////////////////////////////////////////////////////
const NO_IFunction* NO_FunctionList::findFunctionImpl(NO_UInt32 ID) const
{ 
	const NO_IFunction * iter = first;
	while(iter)
	{
		if (iter->getID()==ID){return iter;}
		iter = getNext(iter);
	}
	return 0;
}

//////////////////////////////////////////////////////////////////////////
const NO_IFunction* NO_FunctionList::beginFunctionImpl	(void)					const {return first;}
const NO_IFunction* NO_FunctionList::endFunctionImpl	(void)					const {return 0;}
const NO_IFunction* NO_FunctionList::nextFunctionImpl	(const NO_IFunction* i)	const {return getNext(i);}

//////////////////////////////////////////////////////////////////////////
//
// NoneFunction
//
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
// con/destruction
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
NO_NoneFunctions::NO_NoneFunctions(void){}
NO_NoneFunctions::~NO_NoneFunctions(void){}

//////////////////////////////////////////////////////////////////////////
// retrieve
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
const NO_IFunction* NO_NoneFunctions::findFunctionImpl(const NO_Int8*, const NO_TypeList&)	const{return 0;}
const NO_IFunction* NO_NoneFunctions::findFunctionImpl(NO_UInt32 ID)						const{return 0;}

//////////////////////////////////////////////////////////////////////////
const NO_IFunction* NO_NoneFunctions::beginFunctionImpl	(void)					const {return 0;}
const NO_IFunction* NO_NoneFunctions::endFunctionImpl	(void)					const {return 0;}
const NO_IFunction* NO_NoneFunctions::nextFunctionImpl	(const NO_IFunction* i)	const {return 0;}

